<?php

    class Producto {
        private $id              = null;
        private $tipo_producto   = null;
        private $nombre          = null;
        private $energia         = null;
        private $caracteristicas = null;
        private $imagen          = null;

        function __construct() {}

        function get_id                 () { return $this->id;              }
        function get_tipo_producto      () { return $this->tipo_producto;   }
        function get_nombre             () { return $this->nombre;          }
        function get_energia            () { return $this->energia;         }
        function get_caracteristicas    () { return $this->caracteristicas; }
        function get_imagen             () { return $this->imagen;          }

        function set_id                 ( $value ) { $this->id              = $value; }
        function set_tipo_producto      ( $value ) { $this->tipo_producto   = $value; }
        function set_nombre             ( $value ) { $this->nombre          = $value; }
        function set_energia            ( $value ) { $this->energia         = $value; }
        function set_caracteristicas    ( $value ) { $this->caracteristicas = $value; }
        function set_imagen             ( $value ) { $this->imagen          = $value; }

        static function GetCollection() {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->query('SELECT id, id_tipo_producto, nombre, energia, caracteristicas, imagen FROM productos ORDER BY nombre');

            $collection = array();
            foreach( $sth->fetchAll(PDO::FETCH_ASSOC) as $row ) {
                $instance = new Producto();
                $instance->set_id( $row['id'] );
                $instance->set_tipo_producto( TipoProducto::GetByID($row['id_tipo_producto']) );
                $instance->set_nombre( $row['nombre'] );
                $instance->set_energia( $row['energia'] );
                $instance->set_caracteristicas( json_decode($row['caracteristicas']) );
                $instance->set_imagen( $row['imagen'] );
                array_push( $collection, $instance );
            }

            return $collection;
        }

        static function GetByID( $id ) {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->prepare('SELECT id, id_tipo_producto, nombre, energia, caracteristicas, imagen FROM productos WHERE id = :id');
            $sth->bindParam( ':id', $id, PDO::PARAM_INT );
            $sth->execute();
            $result = $sth->fetch( PDO::FETCH_ASSOC );

            if( ! $result ) return false;

            $instance = new Producto();
            $instance->set_id( $result['id'] );
            $instance->set_tipo_producto( TipoProducto::GetByID($result['id_tipo_producto']) );
            $instance->set_nombre( $result['nombre'] );
            $instance->set_energia( $result['energia'] );
            $instance->set_caracteristicas( json_decode($result['caracteristicas']) );
            $instance->set_imagen( $result['imagen'] );

            return $instance;
        }

        static function Search( $token ) {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->prepare(
                'SELECT     id, nombre
                FROM        productos
                WHERE       nombre LIKE :nombre
                ORDER BY    nombre'
            );
            $bind = "%$token%";
            $sth->bindParam( ':nombre', $bind, PDO::PARAM_STR );
            $sth->execute();

            $collection = array();
            foreach( $sth->fetchAll(PDO::FETCH_ASSOC) as $row ) {
                $instance = new Producto();
                $instance->set_id( $row['id'] );
                $instance->set_nombre( $row['nombre'] );
                array_push( $collection, $instance );
            }

            return $collection;
        }

        function save() {
            if( ! self::GetByID($this->get_id()) ) return $this->insert();
            else                                   return $this->update();
        }

        private function insert() {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->prepare(
                'INSERT INTO productos ( id_tipo_producto, nombre, energia, caracteristicas, imagen )
                VALUES ( :id_tipo_producto, :nombre, :energia, :caracteristicas, "test" )'
            );
            $tp = $this->get_tipo_producto()->get_id();
            $n  = $this->get_nombre();
            $e  = $this->get_energia();
            $c  = json_encode( $this->get_caracteristicas() );
            $sth->bindParam( ':id_tipo_producto', $tp, PDO::PARAM_INT );
            $sth->bindParam( ':nombre',           $n,  PDO::PARAM_STR );
            $sth->bindParam( ':energia',          $e,  PDO::PARAM_STR );
            $sth->bindParam( ':caracteristicas',  $c,  PDO::PARAM_STR );

            return $sth->execute();
        }

        private function update() {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->prepare(
                'UPDATE productos SET 
                    id_tipo_producto = :id_tipo_producto,
                    nombre           = :nombre,
                    energia          = :energia,
                    caracteristicas  = :caracteristicas
                    imagen           = "otro test"
                WHERE id = :id'
            );
            $sth->bindParam( ':id'              , $this->get_id(),                      PDO::PARAM_INT );
            $sth->bindParam( ':id_tipo_producto', $this->get_tipo_producto()->get_id(), PDO::PARAM_INT );
            $sth->bindParam( ':nombre',           $this->get_nombre(),                  PDO::PARAM_STR );
            $sth->bindParam( ':energia',          $this->get_energia(),                 PDO::PARAM_STR );
            $sth->bindParam( ':caracteristicas',  $this->get_caracteristicas(),         PDO::PARAM_STR );

            return $sth->execute();
        }

        function delete() {
            $dbh = DBH::GetInstance()->get_dbh();

            $sth = $dbh->prepare('DELETE FROM productos WHERE id = :id');
            $sth->bindParam( ':id', $this->get_id(), PDO::PARAM_INT );

            return $sth->execute();
        }
    }

?>